#include <stdio.h>  // 引入标准输入输出库，用于printf、scanf等函数
#include <stdlib.h> // 引入标准库，尽管在这段代码中并未直接使用到它的函数
#include <string.h> // 引入字符串处理库，用于strlen、strcmp等函数
#include <ctype.h>  // 引入字符处理库，用于tolower函数

// 定义一个函数，将十六进制字符串转换为十进制整数
unsigned int hexToDecimal(const char *hex) {
    unsigned int decimal = 0; // 初始化十进制数为0
    int len = strlen(hex); // 获取十六进制字符串的长度
    int base = 1; // 初始化基数为1，用于后续计算十六进制每位对应的十进制值

    // 从十六进制数的最低位开始计算
    for (int i = len - 1; i >= 0; --i) {
        char c = tolower(hex[i]); // 将当前字符转换为小写，方便后续处理
        if (c >= '0' && c <= '9') { // 如果字符是数字
            decimal += (c - '0') * base; // 计算该位对应的十进制值并累加到decimal中
        } else if (c >= 'a' && c <= 'f') { // 如果字符是小写字母（十六进制中的a-f）
            decimal += (c - 'a' + 10) * base; // 计算该位对应的十进制值并累加到decimal中
        } else { // 如果字符既不是数字也不是小写字母
            fprintf(stderr, "Invalid hex character: %c\n", hex[i]); // 输出错误信息到标准错误流
            return 0; // 返回0表示转换失败
        }
        base *= 16; // 每次迭代后基数变为原来的16倍，因为十六进制每一位代表的权重是16的倍数
    }

    return decimal; // 返回转换后的十进制数
}

// 主函数
int main() {
    char hexStr[33]; // 定义一个字符数组，用于存储用户输入的十六进制数，假设最大为32位（64个字符，包括null终止符）

    printf("请输入一个十六进制数（输入q结束）: "); // 输出提示信息
    while (1) { // 无限循环，直到遇到输入错误或用户输入q为止
        if (scanf("%32s", hexStr) != 1) { // 使用scanf函数读取用户输入的字符串，%32s限制最多读取32个字符
            // 如果scanf返回值不等于1，表示输入错误或遇到文件结束符（EOF）
            break; // 跳出循环
        }
        if (strcmp(hexStr, "q") == 0) { // 使用strcmp函数比较用户输入的字符串是否为"q"
            // 如果是"q"，则跳出循环
            break; 
        }

        unsigned int decimal = hexToDecimal(hexStr); // 调用hexToDecimal函数进行转换
        printf("十进制数为: %u\n", decimal); // 输出转换后的十进制数

        printf("请输入下一个十六进制数（输入q结束）: "); // 输出提示信息，等待用户输入下一个十六进制数
    }

    printf("程序结束。\n"); // 输出程序结束信息
    return 0; // 返回0，表示程序正常结束
}